package java_0308;

/**
 * 字符串左旋：
 * 法一：暴力求解：字符串内一个一个数字挪
 */
//public class StringLeftMove {
//    public static void LeftRotateString(String str,int n){
//        char[] ch=str.toCharArray();
//        //判空
//        if(str==null||n<0){
//            System.out.println("error,无法左旋");
//            return;
//        }
//        //左旋n个字符
//        for (int i = 0; i < n; i++) {
//            char temp=ch[0];
//            //一个字符的移动
//            int j=0;
//            for (; j < ch.length-1; j++) {
//                ch[j]=ch[j+1];
//            }
//            ch[ch.length-1]=  temp;
//        }
//        str=String.copyValueOf(ch);
//        System.out.println(str);
//    }
//
//    public static void main(String[] args) {
//        String str="abcdefg";
//        LeftRotateString(str,9);
//    }
//}

/**
 * 法二：三步翻转法，n前反转，n后反转，整体反转
 */
public class StringLeftMove{
    public static void LeftRotateString(String str,int n){
        //字符串->字符数组
        char[] ch=str.toCharArray();
        //str和n的合法性
        if(str==null||n<0){
            System.out.println("error,无法左旋");
            return;
        }
        //细节：只有三个字符abc，左旋四次：bca(重复回到开头了)，相当于左旋一次
        n%= ch.length;
        //进行逆序操作
        ch=reverse(ch,0,n-1);//逆序左边
        ch=reverse(ch,n,ch.length-1);//逆序右边
        ch=reverse(ch,0,ch.length-1);//逆序整体
        str=String.copyValueOf(ch);
        System.out.println("逆序结果是"+str);
    }

    private static char[] reverse(char[] ch, int left, int right) {//字符串数组逆序
        while(left<right){
            char temp=ch[left];
            ch[left]=ch[right];
            ch[right]=temp;
            left++;
            right--;
        }
        return ch;
    }

    public static void main(String[] args) {
        String str="abcdefg";
        LeftRotateString(str,10);
    }
}